﻿using Timo.Common.Extension;

namespace Timo.Common.Extension;

/// <summary>
/// 生成器
/// </summary>
public static class GenerateHelper
{
    static private readonly Random random = new Random(~unchecked((int)DateTime.Now.Ticks));
    //static private bool yitIdLoaded = false;

    /// <summary>
    /// 获取全球唯一id
    /// </summary>
    /// <param name="need_char"></param>
    /// <returns></returns>
    public static string GetGuid(bool need_char = true)
    {
        var s = string.Empty;
        s = Guid.NewGuid().ToString();
        if (!need_char)
            s = s.Replace("-", "");
        return s;
    }

    /// <summary>
    /// 随机生成字符串（数字和字母混和）
    /// Generates the check code with number and char
    /// </summary>
    /// <returns>The check code.</returns>
    /// <param name="code_length">Code lenght.</param>
    public static string GenerateRandomCode(int code_length)
    {
        char[] mixed_list = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; //remove I & O
        return GetRandomCode(mixed_list, code_length);
    }

    /// <summary>
    /// 从数组中获取由多个随机数组成的字符串
    /// </summary>
    /// <returns>The random code.</returns>
    /// <param name="char_list">数组</param>
    /// <param name="code_length">长度</param>
    public static string GetRandomCode(char[] char_list, int code_length)
    {
        string result = string.Empty;
        int rnd = 0;
        for (int i = 0; i < code_length; i++)
        {
            rnd = random.Next(0, char_list.Length);
            result += char_list[rnd];
        }
        return result;
    }

    /// <summary>
    /// 生成一个指定范围的随机整数，该随机数范围包括最小值，但不包括最大值
    /// </summary>
    /// <param name="minNum">最小值</param>
    /// <param name="maxNum">最大值</param>
    public static int RandomInt(int min_num, int max_num)
    {
        return random.Next(min_num, max_num);
    }

    /// <summary>
    /// 生成一个0.0到1.0的随机小数
    /// </summary>
    public static double RandomDouble()
    {
        return random.NextDouble();
    }

    /// <summary>
    /// 获取唯一雪花id
    /// </summary>
    /// <returns></returns>
    public static long GetSnowId()
    {
        //if (!yitIdLoaded) {
        //    // 创建 IdGeneratorOptions 对象，可在构造函数中输入 WorkerId：
        //    var options = new IdGeneratorOptions(1);
        //    // options.WorkerIdBitLength = 10; // 默认值6，限定 WorkerId 最大值为2^6-1，即默认最多支持64个节点。
        //    // options.SeqBitLength = 6; // 默认值6，限制每毫秒生成的ID个数。若生成速度超过5万个/秒，建议加大 SeqBitLength 到 10。
        //    // options.BaseTime = Your_Base_Time; // 如果要兼容老系统的雪花算法，此处应设置为老系统的BaseTime。
        //    // ...... 其它参数参考 IdGeneratorOptions 定义。

        //    // 保存参数（务必调用，否则参数设置不生效）：
        //    YitIdHelper.SetIdGenerator(options);
        //    // 以上过程只需全局一次，且应在生成ID之前完成。
        //    yitIdLoaded = true;
        //}
        var newId = YitIdHelper.NextId();
        return newId;
    }




}
